package zdori;

public class J22_PrivateConstructor {

	/**
	 * @param args
	 * private 으로 선언된 생성자
	 * 일반적으로 모든 생성자는 public 이어야 함
	 * 클래스에 대한 객체를 생성하려면
	 * 반드시 필요한 것이 생성자 이기 때문
	 * 
	 * 하지만 어떤 생성자는 private 으로 만들어서 
	 * new 연산자로 그들의 클래스가 객체화 되지 못하게 하는 경우도 있음
	 * prevate 생성자를 사용한 클래스를 singleon 클래스라 부름
	 * 
	 * 생성자는 private 로 선언
	 * 객체변수는 private static 으로 선언해서
	 * 클래스의 객체를 메서드를 통해 접근 가능
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		/*Singlton one = new Singlton();
		Singlton two = new Singlton();
		Singlton three = new Singlton();*/
		
		Singlton one = Singlton.newInstence();
		Singlton two = Singlton.newInstence();
		Singlton three = Singlton.newInstence();
		
	}


}

class Singlton{
	
	//객체 생성 하나만을 위한 선언
	private static Singlton object = null;
	//object 는 static 으로 선언되었기 때문에 단 하나의 객체만 생성가능
	
	
	/*
	public Singlton() {
		// TODO Auto-generated constructor stub
		System.out.println("객체 생성");
	}*/
	
	private Singlton() {
		// TODO Auto-generated constructor stub
		System.out.println("객체 생성");
	}//특수한 생성자
	
	/*public static Singlton newInstence(){
		Singlton object = new Singlton();
		return object;
	}//생성자 메서드는 일반 메서드를 통해서만 호출*/
	
	public static Singlton newInstence(){
		
		if(object == null){
			object = new Singlton();
		}
		//객체가 만들어지지 않았다면 (object == null) 객체를 하나생성함 new Singlton()
		return object;
	}
	
}
